import {getAuthCheckUrls} from "@/config/api-config";

/**
 * HTPP客户端工具
 */
/**
 * 向服务器发送HTTP请求,返回服务器响应数据.支持get、post、delete、put、patch等请求.暂不支持文件上传
 * @param {string} url 请求URL
 * @param {string} type 请求方法
 * @param {{id}} params 请求参数集
 * @param {boolean} isJson  是否为JSON格式数据
 * @param {boolean} uploaded 是否为文件上传
 */



async function getResponse(url, type = 'get', params = {}, isJson = false, uploaded = false) {
    try {
        //判断请求方法
        type = type.toLowerCase();
        if ('get|post|delete|put|patch'.match(type) == null) {
            return getErrorMessage(100405, `不支持的请求方式:${type}`);
        }
        let authCheck = getAuthCheckUrls().find(api=>api===url||url.startsWith(api));
        //判断是否需要登录检查
        if (authCheck) {
            //令牌
            const token = localStorage.getItem('wemall-token');
            if (!token) {
                return getErrorMessage(100401, '未登录或登录已过期');
            }
            params['token'] = token;
        }
        const config = getConfig(type, params, isJson, uploaded);
        if (config.hasOwnProperty('queryString')) {
            let queryString = config.queryString;
            if (-1 === url.indexOf('?')) {
                url = `${url}?${queryString}`
            } else {
                url = `${url}&${queryString}`
            }
        }
        // 发起请求并等待响应
        const response = await fetch(url, config);
        //判断是否请求成功
        if (!response.ok) {
            return getErrorMessage(100400, `请求${url}失败,状态码:${response.status}`);
        }
        // 等待响应数据,将响应数据解析为 JSON
        const data = await response.json();
        //返回响应数据
        return data;
    } catch (error) {
        console.info(error)
        return getErrorMessage(100500, error.msg || '客户端异常');
    }
}

/**
 * 获取fetch函数相关参数
 * @param {string} type 请求方法
 * @param {json} params 请求参数集
 * @param {boolean} isJson  是否为JSON格式数据
 * @param {boolean} uploaded 是否为文件上传
 */
function getConfig(type, params, isJson, uploaded = false) {
    //参数
    const config = {
        method: type,
        headers:{}
    };
    if (isEmptyJson(params)) {
        return config;
    }
    if ('token' in params) {
        let token = params.token;
        delete params.token;
        config.headers['wemall-token'] = token;
    }
    if (uploaded) {
        if ('post' !== type) {
            throw new Error(`文件上传仅支持post请求,当前请求方式为:${type}`);
        }
        const formData = new FormData();
        for (let key in params) {
            formData.append(key, params[key]);
        }
        config.body = formData;
        return config;
    }

    //向服务端传递JSON格式数据
    if ('put' === type || isJson) {
        config.headers['Content-Type'] = 'application/json';
        config.body = JSON.stringify(params);
        return config;
    }
    //GET请求
    if ('get' === type||'delete'===type) {
        config.queryString = new URLSearchParams(params).toString();
        return config;
    }
    //以form表单方式提交数据
    config.headers['Content-Type'] = 'application/x-www-form-urlencoded';
    config.body = new URLSearchParams(params);
    return config;
}

/**
 * 判断JSON对象是否为空
 * @param {Object} obj
 */
function isEmptyJson(obj) {
    if (!isJsonObject(obj)) {
        return true;
    }
    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            return false;
        }
    }
    return true;
};

/**
 * 判断是否为json对象
 * @param {Object} obj
 */
function isJsonObject(obj) {
    return typeof obj === 'object' &&
        obj !== null &&
        !Array.isArray(obj) &&
        Object.prototype.toString.call(obj) === '[object Object]';
}

/**
 * 封装错误消息
 * @param {number} code 状态码
 * @param {string} message 状态信息
 */
function getErrorMessage(code, message) {
    return {
        code,
        message
    }
}

export default getResponse;
